#ifndef __CAMSERVER__H__
#define __CAMSERVER__H__

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <server.h>

#include "readthread.h"

/************************************************************************/
/* Provides reading data from camera, sending object's data to clients	*/
/************************************************************************/
class CameraServer : public Server {

public:

	/************************************************************************/
	/* Creates instance of camera server                                    */
	/************************************************************************/
	CameraServer(int port);

	virtual ~CameraServer();

	/************************************************************************/
	/* Starts camera server                                                 */
	/************************************************************************/
	virtual bool start();
	
	/************************************************************************/
	/* Returns ClientServerThread object by currently connected client      */
	/************************************************************************/
	ClientServerThread * createClientServerThread(SocketClient * client);

	/************************************************************************/
	/* Sets current frame                                                   */
	/************************************************************************/
	void setCurrentFrame(IplImage * frame);

	/************************************************************************/
	/* Gets current frame                                                   */
	/************************************************************************/
	IplImage * getCurrentFrame() const;

	/************************************************************************/
	/* Returns pointer to camera capture                                    */
	/************************************************************************/
	CvCapture * getCapture() const;

	/************************************************************************/
	/* Force ends server                                                    */
	/************************************************************************/
	virtual void end();

	/************************************************************************/
	/* Protect camera frame mutex                                           */
	/************************************************************************/
	wxCriticalSection protectFrameCS;

	CvMat * mat;

protected:

	/************************************************************************/
	/* Camera capture pointer                                               */
	/************************************************************************/
	CvCapture * capture;

	/************************************************************************/
	/* Current camera frame                                                 */
	/************************************************************************/
	IplImage * curFrame;

	/************************************************************************/
	/* Read camera thread                                                   */
	/************************************************************************/
	ReadThread * readThread;

	/************************************************************************/
	/* Starts camera frames read thread                                     */
	/************************************************************************/
	bool startCameraReadThread();

	/************************************************************************/
	/* Calls after client accept                                            */
	/************************************************************************/
	virtual void afterClientAccept(SocketClient * client);
};

#endif //__CAMSERVER__H__
